<?php
/**
 * Clase de Base. Contient toutes les méthodes basique utile pour le site.
 * @author Gaetan Collaud
 */
abstract class Base
{
	/** @var Tpl référence au moteur de template */
	private static $tpl;

	/** @var Sql référence à la BDD */
	private static $sql;

	/** @var Session référence à la session */
	private static $session;

	/** @var Array fil d'ariane du site */
	private static $ariane = array();

	/** @var Array liste des fichiers javascript à inclure */
	private static $js		= array('base');

	/** @var Array liste des fichiers css à inclure */
	private static $css		= array();

	/**
	 * Démarre le moteur de template et la classe SQL
	 * @param Gagatemplate $tpl le moteur de template
	 * @param Sql $sql l'objet SQL
	 */
	public static function start($tpl, $sql){
		self::$tpl = $tpl;
		self::$sql = $sql;
	}

	/**
	 * Démarre la session. Doit être fait après start() car la session peut utiliser les requêtes SQL.
	 * @param Session $session l'objet session
	 */
	public static function startSession($session){
		self::$session = $session;
	}

	/**
	 * returne la référence au moteur de template
	 * @return Tpl référence au moteur de template
	 */
	public static function &getTpl(){
		return self::$tpl;
	}

	/**
	 * retourne la référence à l'objet fesant les transactions avec la base de données.
	 * @return ItfSql référence à la BDD
	 */
	public static function &getSql(){
		return self::$sql;
	}

	/**
	 * retourne la référence à l'objet session
	 * @return Session référence à la session
	 */
	public static function &getSession(){
		if(is_null(self::$session)) exit("Le site n'a pas de system de session.");
		return self::$session;
	}

	/**
	 * Ajoute un élément au fil d'ariane
	 * @param String $t le nom de l'élément
	 * @param String $url le lien de l'élément
	 */
	public static function ariane($t, $url=false){
		self::$ariane[] = array($t, $url);
	}

	/**
	 * Ajoute un fichier javascript à inclure
	 * @param String $file le nom du fichier
	 */
	public static function js($file){
		self::$js[] = $file;
	}

	/**
	 * Ajoute JQuery à la liste des fichiers javascript à inclure
	 */
	public static function jquery(){
		array_unshift(self::$js, 'jquery');
	}

	/**
	 * Ajoute un fichier css à inclure
	 * @param String $file le nom du fichier css
	 */
	public static function css($file){
		self::$css[] = $file;
	}

	/**
	 * Parse un fichier template avec en début le header.html et en fin le footer.html
	 * @param String $file le fichier à parser
	 */
	public static function parse($file){
		self::endPage();
		self::$tpl->parse('html/designs/'.THEME.'/header.html');
		self::$tpl->parse($file.'.html');
		self::$tpl->parse('html/designs/'.THEME.'/footer.html');
	}

	/**
	 * Déclare toutes les variables de base utile dans les templates
	 */
	private static function endPage(){
		self::$tpl->assign(array(
			'DTSQL' => round(self::$sql->getTimeTotal(), 3),
			'DNBQ'	=> self::$sql->getNbQueries(),
			'THEME_DIR'	=> THEME_DIR,
			'URL_DIR'	=> URL_DIR,
			'SESSION'	=> self::getSession(),
			'ADMIN'		=> self::$session->isAdmin(),
			'listJS'	=> self::$js,
			'listCSS'	=> self::$css,
			));
		self::endPageAriane();
	}

	/**
	 * Construit le fil d'ariane
	 * @param String $sT séparateur pour le titre
	 * @param String $sA séparateur pour le fil d'ariane
	 */
	private static function endPageAriane($sT = ' :: ', $sA = ' > '){
		$title = '';
		$fils = TITRE_SITE;
		foreach(self::$ariane as $v){
			$title = $v[0].$sT.$title;
			$fils .= $sA;
			$fils .= $v[1] ? '<a href="'.URL_DIR.$v[1].'">'.$v[0].'</a>' : $v[0];
		}
		$title = $title.TITRE_SITE;
		self::$tpl->assign(array(
			'BTITLE'	=> $title,
			'BARIANE'	=> $fils));
	}

	/**
	 * Convertit un texte pour le passer en url
	 * @param String $t le texte à convertir
	 * @return String le texte convertit
	 */
	public static function url($t){
		return self::stripSpecialChar($t);
	}

	/**
	 * Remplace tous les caractères qui ne sont pas des chiffres ou des lettres par un autre caractère
	 * @param String $t le texte à convertir
	 * @param String $rep le texte de remplacement
	 * @return String le texte convertit
	 */
	public static function stripSpecialChar($t, $rep = '_'){
		$r = '';
		foreach(str_split($t) as $c){
			$asci = ord($c);
			if(
				$asci >= 48 && $asci <= 57 ||	//chiffre
				$asci >= 65 && $asci <= 90 ||	//majuscule
				$asci >= 97 && $asci <= 122		//minuscule
			) $r .= $c;
			else $r .= $rep;
		}
		return $r;
	}

	/**
	 * Alias de htmlentities mais avec l'encodate UTF-8
	 * @param String $t le texte à convertir
	 * @return String le texte convertit
	 */
	public static function html($t){
		return htmlentities($t, ENT_QUOTES, 'UTF-8');
	}
	
	/**
	 * Retourne le temps depuis le début du script
	 * @return float le temps en seconde
	 */
	public static function timePage(){
		return round(microtime(true)-DEB, 3);
	}

	/**
	 * Retour d'une requête ajax
	 * @param String $msg le message
	 * @param boolean $err s'il y a eu une erreur
	 * @param int $reload le temps après lequel la page sera rechargée (0 = pas de rechargement)
	 */
	public static function ajaxRepForm($msg, $err = false, $reload=0){
		$c = $err ? 'erreur' : 'infos';
		$rm = '';
		if($reload>0) $rm = '<br /> La page va se recharger automatiquement dans '.$reload.'sec.';
		exit(json_encode(
			array(
				'err'		=> $err,
				'msg'		=> '<div class="'.$c.'">'.$msg.$rm.'</div>',
				'reload'	=> $reload)));
	}

	/**
	 * Sert à débuger les retours AJAX, retournera une erreur avec un var_export de la variable
	 * @param Mixed $var la variable à tester
	 */
	public static function ajaxDebug($var){
		if($var) self::ajaxRepForm(var_export($var, true), true);
	}

	/**
	 * Permet de retourner les erreurs PHP lors de requêtes Ajax. Utiliser sans argument au début du script et avec $ret à true juste après l'erreur suposée.
	 * @param Boolean $ret s'il faut retourner l'erreur
	 */
	public static function ajaxError($ret=false){
		if($ret){
			if(!is_null(error_get_last())) self::ajaxDebug(error_get_last());
		}else ini_set("display_errors", 0);
	}
}
function timePage(){
	return Base::timePage();
}
?>
